package lz.controls
{

	import flash.display.DisplayObject;
	
	import lz.controls.core.InvalidationType;
	import lz.controls.managers.IFocusManagerComponent;
	/**
	 * Button 组件表示常用的矩形按钮。 Button 组件可显示文本标签、图标或同时显示两者。
	 * Button 组件通常与事件处理函数方法关联，该方法将侦听 click 事件，并在 click 事件被调度后执行指定任务。
	 * 当用户单击启用的按钮时，该按钮调度 click 和 buttonDown 事件。即使按钮尚未启用，它也可以调度其他事件，其中包括：mouseMove、mouseOver、mouseOut、rollOver、rollOut、mouseDown 和 mouseUp。
	 * 可以通过将不同的外观与每个按钮状态关联来更改按钮外观。还可以将 Button 组件设置为执行普通按钮或切换按钮功能。
	 */
	public class Button extends LabelButton implements IFocusManagerComponent
	{
		/**
		 *指示当按钮处于弹起状态时，Button 组件周围是否绘有边框。
		 */
		protected var _emphasized:Boolean=false;
		/**
		 * 边框实例
		 */
		protected var emphasizedBorder:DisplayObject;
		/**
		 * 默认样式
		 */
		private static var defaultStyles:Object={emphasizedSkin: "Button_emphasizedSkin", emphasizedPadding: 2};
		/**
		 * 检索当前组件的默认样式映射。
		 */
		public static function getStyleDefinition():Object
		{
			return mergeStyles(LabelButton.getStyleDefinition(), defaultStyles);
		}
		/**
		 *  Method for creating the Accessibility class.
		 *  This method is called from UIComponent.
		 */
		public static var createAccessibilityImplementation:Function;
		/**
		 *创建新的 Button 组件实例。
		 */
		public function Button()
		{
			super();
		}
		/**
		 * 获取或设置一个布尔值，指示当按钮处于弹起状态时，Button 组件周围是否绘有边框。 
		 * true 值指示当按钮处于弹起状态时其四周带有边框；false 值指示当按钮处于弹起状态时其四周不带边框。
		 * 默认值为 false。
		 */
		public function get emphasized():Boolean
		{
			return _emphasized;
		}
		public function set emphasized(value:Boolean):void
		{
			_emphasized=value;
			invalidate(InvalidationType.STYLES)
		}
		/**
		 * 绘制
		 */
		override protected function draw():void
		{
			if (isInvalid(InvalidationType.STYLES) || isInvalid(InvalidationType.SIZE))
			{
				drawEmphasized();
			}
			super.draw();
			if (emphasizedBorder != null)
			{
				setChildIndex(emphasizedBorder, numChildren - 1);
			}
		}
		/**
		 * 绘制边框
		 */
		protected function drawEmphasized():void
		{
			if (emphasizedBorder != null)
			{
				removeChild(emphasizedBorder);
			}
			emphasizedBorder=null;
			if (!_emphasized)
			{
				return;
			}
			var emphasizedStyle:Object=getStyleValue("emphasizedSkin");
			if (emphasizedStyle != null)
			{
				emphasizedBorder=getDisplayObjectInstance(emphasizedStyle);
			}
			if (emphasizedBorder != null)
			{
				addChildAt(emphasizedBorder, 0);

				var padding:Number=Number(getStyleValue("emphasizedPadding"));
				emphasizedBorder.x=emphasizedBorder.y=-padding;
				emphasizedBorder.width=width + padding * 2;
				emphasizedBorder.height=height + padding * 2;
			}
		}
		/**
		 * 绘制焦点
		 */
		override public function drawFocus(focused:Boolean):void
		{
			super.drawFocus(focused);

			//Add focusRect to stage, and resize
			if (focused)
			{
				// Add the emphasis padding to the focus padding if appropriate
				var emphasizedPadding:Number=Number(getStyleValue("emphasizedPadding"));
				if (emphasizedPadding < 0 || !_emphasized)
				{
					emphasizedPadding=0;
				}

				var focusPadding :Number = Number(getStyleValue("focusRectPadding"));
				focusPadding=(focusPadding == 0) ? 2 : focusPadding;
				focusPadding+=emphasizedPadding;

				uiFocusRect.x=-focusPadding;
				uiFocusRect.y=-focusPadding;
				uiFocusRect.width=width + (focusPadding * 2);
				uiFocusRect.height=height + (focusPadding * 2);
			}
		}
		/**
		 * @private (protected)
		 */
		override protected function initializeAccessibility():void
		{
			if (Button.createAccessibilityImplementation != null)
			{
				Button.createAccessibilityImplementation(this);
			}
		}
	}
}
